package modelo.bd.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import modelo.bd.StoredProcedure;
import modelo.bd.exception.DAOException;
import modelo.dominio.Factura;

public class FacturaDAO extends AbstractDAO<Factura> {

    @Override
    public void add(Factura entity) throws DAOException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void deleteWhere(String condition) throws DAOException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void update(Factura entity) throws DAOException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    protected ArrayList<Factura> select() throws DAOException {
        try {
            con.crear();
            ResultSet resultado = con.ejecutarConsulta(getQuery());
            ArrayList<Factura> facts = new ArrayList();
            while (resultado.next()) {
                Factura fact = new Factura();
                fact.setTipoDoc(resultado.getString("TIPO_DOC"));
                fact.setDocumento(resultado.getString("DOCUMENTO"));
                fact.setSerie(resultado.getString("SERIE"));
                fact.setDocNumero(resultado.getInt("DOC_NUMERO"));
                fact.setMonto(resultado.getDouble("MONTO"));
                fact.setSaldo(resultado.getDouble("SALDO"));
                facts.add(fact);
            }
            resultado.close();
            con.cerrar();
            return facts;
        } catch (ClassNotFoundException ex) {
            throw new DAOException("Error al crear la conexion " + ex.getMessage());
        } catch (SQLException ex) {
            throw new DAOException("Error en DAO Factura " + ex.getMessage());
        } catch (Exception ex) {
            throw new DAOException("Error en el archivo de propiedades " + ex.getMessage());
        }
    }

    @Override
    public ArrayList<Factura> selectAll() throws DAOException {
        this.setQuery("SELECT FACT_PECI_TIPO_GEN AS TIPO_DOC, FACT_SERIE AS DOCUMENTO, "
                + "FACT_SUBTOTAL_FACTURA + FACT_MONTO_IVA AS MONTO, "
                + "FACT_SALDO_SUBTOTAL AS SALDO "
                + "FROM SCC_FACTURAS "
                + "WHERE rownum <= 30");
        return select();
    }

    @Override
    public ArrayList<Factura> selectWhere(String condition) throws DAOException {
        this.setQuery("SELECT FACT_PECI_TIPO_GEN AS TIPO_DOC, FACT_SERIE AS DOCUMENTO, "
                + "FACT_SUBTOTAL_FACTURA + FACT_MONTO_IVA AS MONTO, "
                + "FACT_SALDO_SUBTOTAL AS SALDO "
                + "FROM SCC.SCC_FACTURAS "
                + "WHERE " + condition);
        return select();
    }

    public ArrayList<Factura> selectEspe(String cia, String cliente) throws DAOException {
        this.setQuery("SELECT 'FACT' TIPO_DOC, 'FACTURA' DOCUMENTO, fact_serie SERIE, fact_numero DOC_NUMERO, fact_subtotal_factura+fact_monto_iva MONTO, "
                + "       fact_saldo_subtotal+fact_saldo_iva SALDO "
                + "FROM   scc_facturas "
                + "WHERE  fact_clnt_numero = " + cliente + " "
                + "AND    fact_cmpn_clave  = '" + cia + "' "
                + "AND    fact_status     IN ('I','L','P','R') "
                + "UNION "
                + "SELECT DECODE(noca_tipo_nota,'A','AVCA','NOCA') TIPO_DOC, DECODE(noca_tipo_nota,'A','AVISO CARGO','NOTA CARGO') DOCUMENTO, noca_serie SERIE, "
                + "       noca_numero DOC_NUMERO, noca_subtotal_nota+noca_monto_iva MONTO, noca_saldo_subtotal+noca_saldo_iva SALDO "
                + "FROM   scc_notas_cargo "
                + "WHERE  noca_clnt_numero = " + cliente + " "
                + "AND    noca_cmpn_clave  = '" + cia + "' "
                + "AND    noca_status     IN ('I','L','P','R')");
        return select();
    }

    public String procesar(int cliente, String app, String comentarios, String cia) throws DAOException {
        try {
            String salida = "";
            StoredProcedure sp = new StoredProcedure("SCC_P_INSERTA_PAGO_ICOBRANZA", 5);
            sp.crearSP();
            sp.parametroIN(1, cliente);
            sp.parametroIN(2, cia);
            sp.parametroIN(3, app);
            sp.parametroIN(4, comentarios);
            sp.parametroOUT(5, "");
            sp.ejecutar();
            salida = (String) sp.getResultado(5, "");
            //salida = sp.ejecutar().toString();
            sp.cerrar();
            return salida;
        } catch (Exception ex) {
            throw new DAOException("Error en DAO Factura " + ex.getMessage());
        }
    }
}
